package thread;

/**
 * 线程创建(两种方法)：Thread类在java.lang包中
 * 方法1.继承Thread类，重写run方法
 * 方法2.实现Runable接口，但最终都是要通过Thread
 *
 *
 * 启动线程
 * 1.调用线程对象的start（）方法
 */
public class ThreadCreate extends  Thread{//继承父类Thread
    private  String name;

    /**
     *构造方法
     * @param name
     */
    public ThreadCreate(String name) {
        this.name = name;
    }

    /**
     * 线程体在run方法里写
     *    重写：Alt+Insert 选择run（）方法
     */
    @Override
    public void run() {
        while (true){//为便于观察，写了一个死循环
            System.out.println("我是线程"+name);
            try {
                Thread.sleep(500);//sleep（）方法：在指定的毫秒数内让当前正在执行的线程休眠（暂停执行）
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){//线程从程序入口main()方法开始执行。
        ThreadCreate tc1=new ThreadCreate("线程1");//实例化一个tc1对象
        ThreadCreate tc2=new ThreadCreate("线程2");
        tc1.start();tc2.start();//start()使该线程开始执行；Java 虚拟机调用该线程的 run 方法。
//---------------------------------------------------------------------------------------------------//
        MyRun mr1=new MyRun();MyRun mr2=new MyRun();//创建mr1和mr2对象，但是mr1和mr2都不算线程
        Thread th1=new Thread(mr1);Thread th2=new Thread(mr2);//创建线程对象，th1、th2才是线程
        th1.start();th2.start();//启动线程
/**
 * 下面的匿名内部类相当于MyRun{}类，只是它只适用于创建一个对象的情况，例如只能创建一个th3对象
 */
        Thread th3=new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    System.out.println("我是通过匿名内部类创建的线程");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        th3.start();

        while (true){
            System.out.println("我是主线程！");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 * 创建线程第二种方法
 */
class MyRun implements Runnable{//继承接口Runnable
    @Override
    public void run() {//重写run()方法
        while (true){//死循环
            System.out.println("我是线程"+Thread.currentThread().getName());//显示默认线程名
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
